﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.text.html;
using iTextSharp.text.html.simpleparser;
using System.IO;
using System.Net;



/// <summary>
/// La clase de reportes se utilizara para realizar consultas de la base de datos y cargar las tablas HTML para mostrar los registros de cada reporte especificado
/// Tambien se utilizara para mandar el mismo HTML generado y exportarlo a un archivo PDF.
/// </summary>
public class Reportes
{
    private MySqlClase _mysql;
    private string _html_det="";
    private string _html_alumn = "";
    private string _html_all = "";
    /// <summary>
    /// Constructor solo crea el objeto de clase MysqlClase
    /// </summary>
	public Reportes()
	{
		_mysql= new MySqlClase();
	}

    /// <summary>
    /// Utilizado para enlazar las tablas html con base de datos en repeater
    /// </summary>
    /// <param name="_rep">Objeto de repeater</param>
    /// <param name="_tabla">Utilizado para decidir cual query de tabla utilizar 0-Tabla de alumnos , 1- tabla de detalles, 2- Alumnos Inscritos, 3-Alumnos Re-inscritos, 4- alumnos Aun no reinscritos</param>
    /// <param name="_mat">Matricula para la consulta de detalles,NULL en caso de ser otra consulta</param>
    /// <returns>_rep ya enlazado con la consulta</returns>
    public Repeater llenarAlumnosAdeudo(Repeater _rep,int _tabla,string _mat)
    {
        //DD
        string _query = "";
        switch(_tabla){
            case 0: _query = "Call obtenerAlumnosAdeudos();";
                break;
            case 1: _query = "CALL adeudosPorMatricula(" + _mat + ");";
                break;
            case 2: _query = "CALL alumnosInscritos();";
                break;
            case 3: _query = "CALL alumnosReInscritos();";
                break;
            case 4: _query = "CALL alumnosAunNoReinscritos()";
                break;
        }
        //FUNC
        if (_mysql.AbrirConexion()) {
            if (_mysql.Consultar(_query)) {
                _rep.DataSource = _mysql.DatosConsulta;
                _rep.DataBind();
            }
        }
        _mysql.CerrarConexion();
        return _rep;
    }
    /// <summary>
    /// Genera concatenacion de string _html_all para exportar todos los alumnos con adeudos
    /// </summary>
    public void reporteTodosAlumnosAdeudos()
    {
        //DD
        string _query = "Call obtenerAlumnosAdeudos();";
        //FUNC
        if (_mysql.AbrirConexion())
        {
            if (_mysql.Consultar(_query))
            {
                while (_mysql.DatosConsulta.Read())
                {
                    _html_all += "<tr>\r";
                    _html_all += "<td>\r";
                    _html_all += _mysql.DatosConsulta.GetString("matricula")+"\r";
                    _html_all += "</td>\r";
                    _html_all += "<td>\r";
                    _html_all += _mysql.DatosConsulta.GetString("nombre")+"\r";
                    _html_all += "</td>\r";
                    _html_all += "<td>\r";
                    _html_all += _mysql.DatosConsulta.GetString("grupo")+"\r";
                    _html_all += "</td>\r";
                    _html_all += "<td>\r";
                    _html_all += _mysql.DatosConsulta.GetString("email")+"\r";
                    _html_all += "</td>\r";
                    _html_all += "<td>\r";
                    _html_all += _mysql.DatosConsulta.GetString("carrera")+"\r";
                    _html_all += "</td>\r";
                    _html_all += "</tr>";
                }
            }
        }
        _mysql.CerrarConexion();
    }
    /// <summary>
    /// Se llena _html_det string para luego exportar a pdf!!!!
    /// </summary>
    /// <param name="_mat">Matricula de alumno elegido</param>
    public void reporteDetalleAdeudos(string _mat)
    {
        //DD
        string _query = "CALL adeudosPorMatricula("+_mat+");";
        //FUNC
        if (_mysql.AbrirConexion()) {
            if (_mysql.Consultar(_query)) {
                while (_mysql.DatosConsulta.Read()) {
                    _html_det += @"<tr>
                                   <td>
                                        "+_mysql.DatosConsulta.GetString("alunnos_matricula");
                    _html_det += @"</td>
                                   <td>
                                        "+_mysql.DatosConsulta.GetString("descripcion");
                    _html_det += @"</td>
                                   <td>
                                    "+_mysql.DatosConsulta.GetString("cantidad");
                    _html_det += @"</td>
                                   </tr>";
                }
            }
        }
        _mysql.CerrarConexion();
    }
    /// <summary>
    /// Genera reportes de html -> pdf
    /// </summary>
    /// <param name="_tipo">Tipo de reporte 0 -> todos alumnos con adeudos, 1 -> alumno seleccionado con detalle de adeudos</param>
    /// <param name="_mat">Matricula para el reporte de detalle de adeudos del alumno seleccionado</param>
    public void generarReportePDF(int _tipo,string _mat)
    {
        //DD
        string _html = "";
        switch(_tipo)
        {
            case 0:
                this.reporteTodosAlumnosAdeudos();
                _html = _html_all;
                break;
            case 1:
                this.reporteDetalleAdeudos(_mat);
                _html = _html_det;
                break;
        
        }
        StyleSheet styles = new StyleSheet();
        styles.LoadTagStyle(HtmlTags.TR, HtmlTags.COLOR, "#ff0000");
        using (Document document = new Document())
        {
            PdfWriter.GetInstance(document, new FileStream("c:\\my.pdf", FileMode.Create));
            document.Open();
            List<IElement> objects = HTMLWorker.ParseToList(
              new StringReader(_html), styles
            );
            foreach (IElement element in objects)
            {
                document.Add(element);
            }
            document.Close();
        }
        
        
    }

}